/**
  * @file sorter.h
  * @brief Objets-fonctions pour le tri des ensembles de points
  * @author Thibault Merle et Guillaume Poussel
  */
#ifndef SORTER_H
#define SORTER_H

#include "base/Point.h"
#include "base/sorter.h"


/**
  * @defgroup sorters Comparateurs de points
  */
/* @{ */
/**
  * Comparateur permettant de trier les points par abscisses croissantes
  */
class Point_X_Order {
public:
    virtual bool operator()(const Point*, const Point*) const;
};

/**
  * Comparateur permettant de trier les points par ordonnées croissantes
  */
class Point_Y_Order {
public:
    virtual bool operator()(const Point*, const Point*) const;
};

/**
  * Comparateur permettant de trier les points dans l'ordre lexicographique.
  *
  * Les points sont triés par abscisses croissantes. En cas d'égalité, ils
  * sont ensuite triés par ordonnées croissantes.
  */
class Lexicographic_Order {
public:
    virtual bool operator()(const Point*, const Point*) const;
};

/**
  * Comparateur permettant de trier les points dans le sens horaire ou
  * anti-horaire.
  * @pre L'ensemble de points doit être convexe.
  */
class Clockwise_Order {
private:
    /// Point à l'intérieur de l'ensemble (souvent le barycentre)
    const Point* _O;
    /// Point de référence pour le tri
    const Point* _ref;
    /// Sens du tri : \p true pour le sens horaire, \p false anti-horaire
    bool _clock_wise;
public:
    Clockwise_Order(const Point* O, const Point* ref, bool clock_wise)
        : _O(O), _ref(ref), _clock_wise(clock_wise) {};
    virtual bool operator()(const Point*, const Point*) const;
};

/**
  * Comparateur pour éliminer le doublons d'un ensemble de points.
  * Il utilise l'opérateur \p == de la classe #Point.
  */
class Point_Comparator {
public:
    virtual bool operator()(const Point*, const Point*) const;
};

/* @} */
#endif // SORTER_H
